<?php
class ImageUtil
{
	
	
	/**
	 * 生成缩略图(强大的PHP生成缩略图函数。)
	 * @author yangzhiguo0903@163.com
	 * @param string     源图绝对完整地址{带文件名及后缀名}
	 * @param string     目标图绝对完整地址{带文件名及后缀名}
	 * @param int        缩略图宽{0:此时目标高度不能为0，目标宽度为源图宽*(目标高度/源图高)}
	 * @param int        缩略图高{0:此时目标宽度不能为0，目标高度为源图高*(目标宽度/源图宽)}
	 * @param int        是否裁切{宽,高必须非0}
	 * @param int/float  缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
	 * @return boolean
	 */
	static function img2thumb($src_img, $dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0){
	    if(!is_file($src_img)){
	        return false;
	    }
	    $ot = pathinfo($dst_img, PATHINFO_EXTENSION);
	    $otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
	    $srcinfo = getimagesize($src_img);
	    $src_w = $srcinfo[0];
	    $src_h = $srcinfo[1];
	    $type  = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
	    $createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);
	
	    $dst_h = $height;
	    $dst_w = $width;
	    $x = $y = 0;
	
	    /**
	     * 缩略图不超过源图尺寸（前提是宽或高只有一个）
	     */
	    if(($width> $src_w && $height> $src_h) || ($height> $src_h && $width == 0) || ($width> $src_w && $height == 0)){
	        $proportion = 1;
	    }
	    if($width> $src_w){
	        $dst_w = $width = $src_w;
	    }
	    if($height> $src_h){
	        $dst_h = $height = $src_h;
	    }
	
	    if(!$width && !$height && !$proportion){
	        return false;
	    }
	    if(!$proportion){
	        if($cut == 0){
	            if($dst_w && $dst_h){
	                if($dst_w/$src_w> $dst_h/$src_h){
	                    $dst_w = $src_w * ($dst_h / $src_h);
	                    $x = 0 - ($dst_w - $width) / 2;
	                }else{
	                    $dst_h = $src_h * ($dst_w / $src_w);
	                    $y = 0 - ($dst_h - $height) / 2;
	                }
	            }else if($dst_w xor $dst_h){
	                if($dst_w && !$dst_h){	//有宽无高
	                    $propor = $dst_w / $src_w;
	                    $height = $dst_h  = $src_h * $propor;
	                }else if(!$dst_w && $dst_h){	//有高无宽
	                    $propor = $dst_h / $src_h;
	                    $width  = $dst_w = $src_w * $propor;
	                }
	            }
	        }else{
	            if(!$dst_h){	//裁剪时无高
	                $height = $dst_h = $dst_w;
	            }
	            if(!$dst_w){	//裁剪时无宽
	                $width = $dst_w = $dst_h;
	            }
	            $propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
	            $dst_w = (int)round($src_w * $propor);
	            $dst_h = (int)round($src_h * $propor);
	            $x = ($width - $dst_w) / 2;
	            $y = ($height - $dst_h) / 2;
	        }
	    }else{
	        $proportion = min($proportion, 1);
	        $height = $dst_h = $src_h * $proportion;
	        $width  = $dst_w = $src_w * $proportion;
	    }
	
	    $src = $createfun($src_img);
	    $dst = imagecreatetruecolor($width ? $width : $dst_w, $height ? $height : $dst_h);
	    $white = imagecolorallocate($dst, 255, 255, 255);
	    imagefill($dst, 0, 0, $white);
	
	    if(function_exists('imagecopyresampled')){
	        imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
	    }else{
	        imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
	    }
	    $otfunc($dst, $dst_img);
	    imagedestroy($dst);
	    imagedestroy($src);
	    return true;
	}
	
	/**
	 * 图片剪切
	 * @param $imgsrc 源图片地址
	 * @param $imgdst 剪切后存放的图片地址
	 * @param $x 剪切起点X坐标
	 * @param $y 剪切起点Y坐标
	 * @param $dstW	剪切的宽度
	 * @param $dstH 剪切的高度
	 */
	static function cropImage($imgsrc,$imgdst,$x,$y,$dstW,$dstH){
		
		//剪切图大小
		$width = 150;
		$height = 150;
		
		/*读取图片 */
		$ext = CommonUtil::getExtendName($imgsrc);
		$im = false;
		if($ext=='jpg'||$ext=='jpeg'){
            $im = imagecreatefromjpeg($imgsrc);
        }elseif($ext=='gif'){
            $im = imagecreatefromgif($imgsrc);
        }elseif($ext=='png'){
            $im = imagecreatefrompng($imgsrc);
        }
        if($im == false){
        	return "请上传图片文件(如：JPG、GIF、PNG)";
        }
        
        /*if($ext == 'png'){
        	imagesavealpha($im,true);//这里很重要;
        }*/
        
        
		
		/* 先建立一个 新的空白图片档 */
		$dstim = imagecreatetruecolor($width, $height);
		
		$white = imagecolorallocate($dstim,255,255,255);
        imagefilledrectangle($dstim,0,0,$width,$height,$white);
        imagecolortransparent($dstim,$white);
		
		/*if($ext == 'png'){
			imagealphablending($dstim,false);//这里很重要,意思是不合并颜色,直接用$img图像颜色替换,包括透明色;
			imagesavealpha($dstim,true);//这里很重要,意思是不要丢了$thumb图像的透明色;
		}*/
		
		// 输出图要从哪边开始x, y , 原始图要从哪边开始 x, y , 要输多大 x, y(resize) , 要抓多大 x, y
		imagecopyresampled($dstim, $im, 0, 0, $x, $y, $width, $height, $dstW, $dstH);
		
		/* 保存图片 */
		if($ext=='jpg'||$ext=='jpeg'){
            imagejpeg($dstim,$imgdst,100);
        }elseif($ext=='gif'){
            imagegif($dstim,$imgdst,100);
        }elseif($ext=='png'){
            imagepng($dstim,$imgdst);
        }else{
        	imagejpeg($dstim,$imgdst,100);
        }
		
		
		//imagejpeg($dstim,$imgdst,100);
		/* 资源回收 */
		imagedestroy($dstim);
		imagedestroy($im);

	}
	
	//获取图片内存资源
	public static function getImageResource($imgsrc){
		$ext = CommonUtil::getExtendName($imgsrc);
        $src_image = false;
		if($ext=='jpg'||$ext=='jpeg'){
            $src_image = imagecreatefromjpeg($imgsrc);
        }
        if($ext=='gif'){
            $src_image = imagecreatefromgif($imgsrc);
        }
        if($ext=='png'){
            $src_image = imagecreatefrompng($imgsrc);
        }
        return $src_image;
	}
	
	// 说明：获取图片信息，参数是上传后的临时文件，成功返回数组，失败返回FALSE和错误信息
	// array/bool _getinfo(string $upload_tmp_file)
	public static function _getinfo($img){
		if (!file_exists($img)){
			$this->error = '找不到图片，无法获取其信息';
			return FALSE;
		}
		$tempFile = @fopen($img, "rb");
		$bin = @fread($tempFile, 2); //只读2字节
		@fclose($tempFile);
	
		$strInfo = @unpack("C2chars", $bin);
		$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
		$fileType = '';
		switch ($typeCode){ // 6677:bmp 255216:jpg 7173:gif 13780:png 7790:exe 8297:rar 8075:zip tar:109121 7z:55122 gz 31139
			case '255216':
				$fileType = 'jpg';
				break;
			case '7173':
				$fileType = 'gif';
				break;
			case '13780':
				$fileType = 'png';
				break;
			default:
				$fileType = 'unknown';
		}
		if ($fileType == 'jpg' || $fileType == 'gif' || $fileType == 'png'){
			$imageInfo = getimagesize($img);
			$imgInfo['size'] = $imageInfo['bits'];
			$imgInfo["type"] = $fileType;
			$imgInfo["width"] = $imageInfo[0];
			$imgInfo["height"] = $imageInfo[1];
			return $imgInfo;
		}else{ // 非图片类文件信息
			$this->error = '图片类型错误';
			return FALSE;
		}
	} // end _getinfo


}